#pragma once
// 进行了数据的类型转换（序列化反序列化），属于表示层

#include "Protocol.hpp"
#include "Logger.hpp"
#include <iostream>
#include <string>
#include <functional>

// 只负责对报文进行各种解析工作

using handler_t = std::function<Response(Request &req)>;

class Parser
{
public:
    Parser(handler_t handler)
        : _handler(handler)
    {
    }

    std::string Parse(std::string &inbuffer)
    {
        std::string send_str;
        while (true) // 有可能一次传过来的字符串里有好几个完整的报文，循环是为了把所有的报文都解析出来
        {
            // 1、解包
            std::string json_str;
            int n = Protocol::UnPackage(inbuffer, &json_str);

            if (n < 0)
                exit(0); // 进程立刻终止，包括HandlerRequest后的内容也不会执行
            else if (n == 0)
                break; // 说明报文已经解包完毕了
            else
            {
                // 2、反序列化
                Request req;
                if (!req.Deserialize(json_str))
                    return std::string();
                // 3、计算（应用层）
                Response resp = _handler(req);
                // 4、序列化
                std::string resp_json;
                if (!resp.Serialize(&resp_json))
                    return std::string();

                // 5、打包
                send_str += Protocol::Package(resp_json);
            }
        }
        return send_str;
    }

    ~Parser() {}

private:
    handler_t _handler;
};